package it.slkfarm.mail;

import java.util.Date;
import java.util.Properties;

import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailSender extends javax.mail.Authenticator
{
	
	/**
	 * @uml.property  name="user"
	 */
	private String user; 
	/**
	 * @uml.property  name="pass"
	 */
	private String pass; 		 
	/**
	 * @uml.property  name="to"
	 */
	private String[] to; 
	/**
	 * @uml.property  name="from"
	 */
	private String from; 	 
	/**
	 * @uml.property  name="port"
	 */
	private String port; 
	/**
	 * @uml.property  name="sport"
	 */
	private String sport;  
	/**
	 * @uml.property  name="host"
	 */
	private String host; 
	/**
	 * @uml.property  name="subject"
	 */
	private String subject; 
	/**
	 * @uml.property  name="body"
	 */
	private String body; 
	/**
	 * @uml.property  name="auth"
	 */
	private boolean auth; 
	/**
	 * @uml.property  name="debuggable"
	 */
	private boolean debuggable; 	 
	/**
	 * @uml.property  name="multipart"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private Multipart multipart; 
		 
		 
	public MailSender(String user, String pass) 
	{ 
		this.user = user; 
		this.pass = pass; 
		host = "smtp.gmail.com"; // default smtp server 
		port = "465"; // default smtp port 
		sport = "465"; // default socketfactory port 
		from = ""; // email sent from 
		subject = ""; // email subject 
		body = ""; // email body 
		 
		debuggable = false; // debug mode on or off - default off 
		auth = true; // smtp authentication - default on 
		 
		multipart = new MimeMultipart(); 
		
		MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
		mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
		mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
		mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
		mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
		mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
		CommandMap.setDefaultCommandMap(mc); 
	} 
		 
	public boolean send() throws Exception 
	{ 
		Properties props = _setProperties(); 
		 
		if(!user.equals("") && !pass.equals("") && to.length > 0 && !from.equals("") && !subject.equals("") && !body.equals("")) 
		{ 
			Session session = Session.getDefaultInstance(props, this); 
			MimeMessage msg = new MimeMessage(session); 
		    msg.setFrom(new InternetAddress(from)); 
		    InternetAddress[] addressTo = new InternetAddress[to.length]; 
		    for (int i = 0; i < to.length; i++) 
		    { 
		        addressTo[i] = new InternetAddress(to[i]); 
		    } 
		    msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
		    msg.setSubject(subject); 
		    msg.setSentDate(new Date()); 
		    BodyPart messageBodyPart = new MimeBodyPart(); 
		    messageBodyPart.setText(body); 
		    multipart.addBodyPart(messageBodyPart); 
		    msg.setContent(multipart); 
		    Transport.send(msg);
		    return true; 
		} 
		else 
		{ 
		      return false; 
		} 
	} 
		 
	public void addAttachment(String filename) throws Exception 
	{ 
		BodyPart messageBodyPart = new MimeBodyPart(); 
		DataSource source = new FileDataSource(filename); 
		messageBodyPart.setDataHandler(new DataHandler(source)); 
		messageBodyPart.setFileName(filename);  
		multipart.addBodyPart(messageBodyPart); 
	} 
		 
	@Override 
	public PasswordAuthentication getPasswordAuthentication() 
	{ 
		return new PasswordAuthentication(user, pass); 
	} 
		 
	private Properties _setProperties() 
	{ 
		Properties props = new Properties(); 
		props.put("mail.smtp.host", host); 
		if(debuggable) 
		{ 
			props.put("mail.debug", "true"); 
		} 
		    
		if(auth) 
		{ 
		    props.put("mail.smtp.auth", "true"); 
		} 
		 
		props.put("mail.smtp.port", port); 
		props.put("mail.smtp.socketFactory.port", sport); 
		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
		props.put("mail.smtp.socketFactory.fallback", "false"); 
		 
		return props; 
	}

	/**
	 * @return
	 * @uml.property  name="user"
	 */
	public String getUser() {
		return user;
	}

	/**
	 * @param user
	 * @uml.property  name="user"
	 */
	public void setUser(String user) {
		this.user = user;
	}

	/**
	 * @return
	 * @uml.property  name="pass"
	 */
	public String getPass() {
		return pass;
	}

	/**
	 * @param pass
	 * @uml.property  name="pass"
	 */
	public void setPass(String pass) {
		this.pass = pass;
	}

	/**
	 * @return
	 * @uml.property  name="to"
	 */
	public String[] getTo() {
		return to;
	}

	/**
	 * @param to
	 * @uml.property  name="to"
	 */
	public void setTo(String[] to) {
		this.to = to;
	}

	/**
	 * @return
	 * @uml.property  name="from"
	 */
	public String getFrom() {
		return from;
	}

	/**
	 * @param from
	 * @uml.property  name="from"
	 */
	public void setFrom(String from) {
		this.from = from;
	}

	/**
	 * @return
	 * @uml.property  name="port"
	 */
	public String getPort() {
		return port;
	}

	/**
	 * @param port
	 * @uml.property  name="port"
	 */
	public void setPort(String port) {
		this.port = port;
	}

	/**
	 * @return
	 * @uml.property  name="sport"
	 */
	public String getSport() {
		return sport;
	}

	/**
	 * @param sport
	 * @uml.property  name="sport"
	 */
	public void setSport(String sport) {
		this.sport = sport;
	}

	/**
	 * @return
	 * @uml.property  name="host"
	 */
	public String getHost() {
		return host;
	}

	/**
	 * @param host
	 * @uml.property  name="host"
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * @return
	 * @uml.property  name="subject"
	 */
	public String getSubject() {
		return subject;
	}

	/**
	 * @param subject
	 * @uml.property  name="subject"
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * @return
	 * @uml.property  name="body"
	 */
	public String getBody() {
		return body;
	}

	/**
	 * @param body
	 * @uml.property  name="body"
	 */
	public void setBody(String body) {
		this.body = body;
	}

	/**
	 * @return
	 * @uml.property  name="auth"
	 */
	public boolean isAuth() {
		return auth;
	}

	/**
	 * @param auth
	 * @uml.property  name="auth"
	 */
	public void setAuth(boolean auth) {
		this.auth = auth;
	}

	/**
	 * @return
	 * @uml.property  name="debuggable"
	 */
	public boolean isDebuggable() {
		return debuggable;
	}

	/**
	 * @param debuggable
	 * @uml.property  name="debuggable"
	 */
	public void setDebuggable(boolean debuggable) {
		this.debuggable = debuggable;
	}

	/**
	 * @return
	 * @uml.property  name="multipart"
	 */
	public Multipart getMultipart() {
		return multipart;
	}

	/**
	 * @param multipart
	 * @uml.property  name="multipart"
	 */
	public void setMultipart(Multipart multipart) {
		this.multipart = multipart;
	}

}
